STM32系统中2种数据掉电保护的方法
The following article is from 芯片之家 Author 谢伦义
在嵌入式设备开发中,往往需要保存一些掉电不易失性的数据,如果系统配置、用户定制信息等等,如果增加额外的ROM IC,比如(基于I2C的24C02等等)往往会造成额外的PCB空间增大,硬件成本增加,降低产品的性价比。如果单从实用性来讲,在stm32的系统中,诸如此类的应用,笔者推荐如下2个方法可以去尝试和借鉴。
基于备份寄存器
软件编程要点,以一个项目中常用的case为例:
功能初始化:
备份寄存器读出:void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data)
备份寄存器读出:uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR)
该方法使用简单,清晰,但是由于总共的可以利用的空间少,故该方法只是适合于保存小批量的数据,如穿戴设备中用户的常用配置数据。
基于内部闪存
在stm32芯片中,Flash的读写单位都是以“页”为单位的,以STM32F103C8T6为例,它的每页大小为2K bytes;
软件编程要点
读写保护解除:使用这种方法前提是,当前读和写Flash的允许的,假设当前flash已经是允许写的。所以暂时一些关于OptionBytes的操作和Flash的读写保护操作等API暂时不做讨论。
FlashWrite:单个uint32_t数据的写入简易流程如图:
FlashRead:对于单个int数据的读出,比较简单,通过下列语句完成:rdData= (*(__IOuint32_t *)dataAddr);
由于SW介入的API较多,并且有很多的额外的背景知识需要码农去了解,使用该方法,相对比较复杂。但是由于保存数据以页为单位,页的大小可以多达2048bytes,所以该方法可以实用于保存掉电不易失的大数据。考虑到flash读写保护的逻辑机制,该方法最好在不考虑数据的安全性问题前提下,才使用这种方法。
对于诸如此类的掉电保护数据方法,这里仅仅是抛砖引玉,欢迎大家多多提出更好的方案。
暂时分享这么多,谢谢大家。
推荐阅读
▼
串口通讯的一点有用的经验
STM32内部FLASH读写操作详解(附代码)